// components/sheet/index.js
Component({
  /**
   * 组件的属性列表
   */
  properties: {
    class: {
      type: String,
      value: 'bottom-sheet',
    }
  },

  /**
   * 组件的初始数据
   */
  data: {
    // 弹窗是否显示
    visible: false,
    // 是否正在录制
    recording: false,
    // 倒计时
    countdown: 60
  },
  // 录音实例
  recorderManager: null,
  // 录音倒计时
  interval: null,
  // 长按时开始点
  startPoint: null,

  /**
   * 组件的方法列表
   */
  methods: {
    // 开始录音
    handleRecordStart(e) {
      // 记录长按时开始点信息，后面用于计算上划取消时手指滑动的距离。
      this.startPoint = e.touches[0]
      // 设置屏幕常亮
      wx.setKeepScreenOn({
        keepScreenOn: true
      })
      // 开始录音
      this.recorderManager.start()
      this.setData({
        recording: true,
        countdown: 60
      })
      // 倒计时
      this.interval = setInterval(() => {
        const { countdown } = this.data
        if (countdown > 0) {
          this.setData({
            countdown: countdown - 1
          })
        } else {
          // 结束录音
          this.handleRecordStop()
        }
      }, 1000)
    },
    // 结束录音
    handleRecordStop() {
      this.setData({
        recording: false
      })
      wx.hideToast()
      clearInterval(this.interval)
      this.recorderManager.stop()
      wx.setKeepScreenOn({
        keepScreenOn: false
      })
    },
    // 手指移动时触发
    handleTouchMove(e) {
      // 移动距离
      const moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY
      if (Math.abs(moveLenght) > 50) {
        // 结束录音
        this.handleRecordStop()
      }
    },
    // 显示弹窗
    show() {
      // 获取录音权限
      wx.authorize({
        scope: 'scope.record',
        success: () => {
          this.setData({
            visible: true
          }, () => {
            this.recorderManager = wx.getRecorderManager()
            this.recorderManager.onStop(res => {
              // 少于1秒不发送
              if (res.duration < 1000) {
                wx.showToast({
                  title: '录音时间太短',
                  icon: 'none',
                  duration: 1000
                })
              } else {
                this.hide()
                this.close(res)
              }
            })
          })
        }
      })
    },
    // 隐藏弹窗
    hide() {
      this.setData({
        visible: false
      })
    },
    // 关闭弹窗
    close(data) {
      setTimeout(() => {
        this.triggerEvent('close', data)
      }, 300)
    }
  }
})
